package chapter1_5_sleep;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Thread 类中有一个静态的s leep 方法，当一个执行中的线程调用了Thread 的sleep 方
 * 法后，调用线程会暂时让出指定时间的执行权，也就是在这期间不参与CPU 的调度，但
 * 是该线程所拥有的监视器资源，比如锁还是持有不让出的
 *
 * 指定的睡眠时间到了后该函数会正常返回，线程就处于就绪状态，然后参与CPU 的调度，获取到CPU 资源后就可以继
 * 续运行了。如果在睡眠期间其他线程调用了该线程的interrupt（）方法中断了该线程，则该
 * 线程会在调用sleep 方法的地方抛出InterruptedException 异常而返回。
 *
 * @author huayuhao
 * @date 2020/12/15 16:31
 */
public class SleepTest2 {

    /**
     * 创建一个独占锁
     */
    private static final Lock LOCK = new ReentrantLock();

    /**
     * 看看A 获取锁之后, 是不是失去了锁的控制权
     */
    public static void main(String[] args) throws InterruptedException{

        Thread A = new Thread(() -> {
            // 上锁
            LOCK.lock();
            try{
                System.out.println("A 开始睡 5s");
                Thread.sleep(5000);
                System.out.println("A 睡醒了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 记得释放锁
                LOCK.unlock();
            }
        });

        Thread B = new Thread(() -> {
            // 上锁
            LOCK.lock();
            try{
                System.out.println("B 开始睡 5s");
                Thread.sleep(5000);
                System.out.println("B 睡醒了");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 记得释放锁
                LOCK.unlock();
            }
        });

        A.start();
        B.start();
        System.out.println("main over");
    }
}
